package cn.flying.cloud.base.common.utils.crypto;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Java jdk 原生 Des 加解密
 * Data Encrytion Standard（数据加密标准) , 特点：1. 对称加密  2. 同一个 SECRET_KEY（密钥）
 *
 * @author: admin
 * @date: 2025年01月23日 09:18
 * @version: 1.0
 */
public class DESUtil {
    private static final Logger logger = LoggerFactory.getLogger(DESUtil.class);
    // 加密算法
    private static final String ALGORITHM = "DESede";
    private static final String ALGORITHM_PKCS5PADDING = "DESede/ECB/PKCS5Padding";
    // keySize must be equal to 112 or 168
    private static final int KEY_SIZE = 168;

    /**
     * 生成密钥文本
     *
     * @param keySeed 用于生成密钥的内容，可以任意随机
     * @return 返回密钥文本
     * @throws Exception
     */
    public static String generateKey(String keySeed) {
        try {
            return CipherUtils.generateKey(keySeed, ALGORITHM, KEY_SIZE);
        } catch (Exception e) {
            logger.error("密钥生成失败", e);
            return "";
        }
    }

    /**
     * des 加密
     *
     * @param data   被加密的内容
     * @param secret 密钥文本
     * @return 加密好的内容(base64)
     */
    public static String encrypt(String data, String secret) throws Exception {
        return CipherUtils.encrypt(data, secret, ALGORITHM, ALGORITHM_PKCS5PADDING);
    }

    /**
     * DES 解密
     *
     * @param cipherText 密文(base64)
     * @param secret     密钥
     * @return 解密好的内容
     * @throws Exception
     */
    public static String decrypt(String cipherText, String secret) throws Exception {
        return CipherUtils.decrypt(cipherText, secret, ALGORITHM, ALGORITHM_PKCS5PADDING);
    }


    public static void main(String[] args) throws Exception {
        String data = "AES: Advanced Encrytion Standard（高级加密标准），特点：1. 对称加密  2. 一个 SECRET_KEY（密钥）扩展成多个子 SK，轮加密";
        String keySrc = "e27568c9-658c-49ea-b178-1437fce69046";
        String secret = generateKey(keySrc);
        // 密钥文本-> SctnONUgBBViDWRS4GHm0z7mXtDEMl3L
        System.err.println("密钥文本-> " + secret);

        String encrypt = encrypt(data, secret);
        // 密文-> Y9U3QYAzLSOxJryjvywBOsb+pDnGVnBoJ6gQwrPI+NFxyWWd3/shTFmI19gFuzHw7aHPSxM93I8Inz6SLtFb+ttjA/IhOs+Ug6ZP00wcZfKJT1nTMZ5PAJ+S0xa02WFJlz7SM3F/82mu/JYNbmd36b/xJjN1EkXe6EJjJbbGwJHrFxDR4BsfV5ky98Z/WFGSdbGPw0Quic4=
        System.out.println("密文-> " + encrypt);

        String decrypt = decrypt(encrypt, secret);
        System.out.println("明文-> " + decrypt);
    }
}